669. 修剪二叉搜索树

669. 修剪二叉搜索树

Similar Question

leading to the advanced question

Solution Tips

方案一: DFS

因为需要同时删除节点和一半的子树, 所以不需要讨论 remove 的那三种情况

var trimBST = function(root, low, high) {
    // 不是自平衡的二叉树, 就是普通的 BST
    // 通过递归找到需要删除的节点, 返回需要保留的节点
    return dfs(root, low, high);
    function dfs(node, low, high) {
        if (node === null) return node;

        if (node.val < low) {
            // 该 node 以及自身左子树应该删除
            // 右子树则需要继续递归
            // 返回右子树递归的结果
            return dfs(node.right, low, high);
        }
        else if (node.val > high) {
            // 该 node 以及自身右子树应该删除
            // 左子树则需要继续递归
            // 返回左子树递归的结果替代自身, 相当于删除了自身以及右子树
            return dfs(node.left, low, high)
        }
        else {
            node.left = dfs(node.left, low, high)
            node.right = dfs(node.right, low, high)
        }

        return node;
    }
};